﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
using Delta_util.Clases;

namespace Delta_webControl.Templates
{
    public class ColumnaGridDG : TemplateField
    {

        /// <summary>
        /// Delegador que permite configurar los controles que se muestran en la celda.
        /// </summary>
        /// <param name="contenedor">Contenedor.</param>
        public delegate void DibujarControles(System.Web.UI.Control contenedor);

        /// <summary>
        /// Delegado que permite configurar el enlace de un control con una celda
        /// </summary>
        /// <param name="sender">El componente a enviar.</param>
        /// <param name="e">Datos del evento.</param>
        /// <param name="valorPropiedad">Valor que contiene la propiedad enlazada a la celda.</param>
        /// <param name="tag">Tag del grid.</param>
        /// <param name="grid">GridView que contiene la celda.</param>
        /// <param name="contenedor">Contenedor.</param>
        /// <param name="item">Datos de la fila.</param>
        public delegate void OperacionEnlace(object sender, EventArgs e, object valorPropiedad, string tag, GridView grid, IDataItemContainer contenedor, object item);

        /// <summary>
        /// Variable que permite la configuracion de los controles en la celda template.
        /// </summary>
        public DibujarControles dlDibujarControles;

        /// <summary>
        /// Obtiene o establece el nombre del campo con el que se enlaza la clase.
        /// </summary>
        /// <value>El nombre del campo</value>
        public string DataField { get; set; }
        /// <summary>
        /// Constructor de la clase.
        /// </summary>        
        public ColumnaGridDG()
        {
            this.ItemTemplate = new ItemColumnaGrid(this);
        }

        /// <summary>
        ///Metodo que permite configurar el enlace de un control con una celda del grid,permitiendo obtener el valor de la propiedad enlazada.
        /// </summary>
        /// <param name="control">El componente que generó el evento.</param>
        /// <param name="operacion">Operaciones extras a ejecutar cuando se enlace el control.</param>
        public void ConfigurarEnlace(System.Web.UI.Control control, OperacionEnlace operacion = null)
        {
            control.DataBinding += (object sender, EventArgs e) =>
            {
                Control ctrl = (Control)sender;

                object bound_value_obj = null;

                IDataItemContainer data_item_container = (IDataItemContainer)ctrl.NamingContainer;
                GridView grd = (data_item_container as GridViewRow).Parent.Parent as GridView;
                string tagDG = (string)Utilerias.ObtenerValorGET(grd.Page, "tag");

                bound_value_obj = DataBinder.Eval(data_item_container.DataItem, DataField);
                if (operacion != null)
                    operacion(sender, e, bound_value_obj, tagDG, grd, data_item_container, data_item_container.DataItem);
            };

        }
    }

    public class ItemColumnaGrid : ITemplate
    {

        /// <summary>
        /// Datos.
        /// </summary>
        protected ColumnaGridDG datos;

        /// <summary>.
        /// Constructor de la clase
        /// </summary>
        /// <param name="padre">The padre.</param>
        public ItemColumnaGrid(ColumnaGridDG padre) { datos = padre; }

        /// <summary>
        /// Cuando se implementa mediante una clase, define el objeto <see cref="T:System.Web.UI.Control" /> al que pertenecen los controles secundarios y las plantillas.Estos controles secundarios están a su vez definidos en una plantilla en línea.
        /// </summary>
        /// <param name="container">Objeto <see cref="T:System.Web.UI.Control" /> que contiene las instancias de los controles de la plantilla en línea.</param>
        public void InstantiateIn(System.Web.UI.Control container)
        {
            if (datos.dlDibujarControles != null) { datos.dlDibujarControles(container); }
        }

    }
}
